package com.leetcode.图.图的最长链;

import java.util.Scanner;

public class Main {
	final static int maxN = 10000 + 10;// 节点总数最多
	final static int maxE = 200000 + 20;// 边的总数最多

	final static Edge[] e = new Edge[maxE]; // e[i]:第i条边的信息
	final static int[] head = new int[maxN]; // head[u]:记录u节点 ‘最后’指向的边是总数的第几条边

	static int eCnt = 0; // 记录总的有多少边
	static int maxLen = 0;// 记录链长

	final static int[] rd = new int[maxN];// rd[v]:v的度,不为0表示指向v的点不只一个，则v肯定不是最长链中的一个起点

	final static int[] ans = new int[maxN];// 存储最长链的每个节点
	final static int[] temp = new int[maxN];// 存储等长链的每个几点，跟ans判断，得出最终结果

	final static Scanner input = new Scanner(System.in);

	public static void main(String[] args) {
		int n = input.nextInt();
		for (int u = 0; u < n; u++) {
			int m = input.nextInt();
			for (int j = 0; j < m; j++) {
				int v = input.nextInt();
				addEdge(u, v);
				rd[v]++;// v的度加1，表示指向v的点不只一个，则v肯定不是最长链中的一个起点
			}
		}
		// 开始搜索操作
		for (int i = 0; i < n; i++) {
			if (rd[i] == 0) {// 表示该点可以作为起点
				dfs(i, 1);// 从点i开始搜索，开始处于第1层，也就是当前链长为1
			}
		}
		System.err.println(maxLen);
		for(int i = 1;i < maxLen;i++) {
			System.out.print(ans[i] + " ");
		}
		System.out.print(ans[maxLen]);
	}

	public static void addEdge(int u, int v) {// 记录u --> v的一条边
		e[++eCnt] = new Edge(v, head[u]);
		head[u] = eCnt;
	}

	public static boolean check(int deep) {//为true，表示temp的序列比ans小，满足题意
		for (int i = 1; i <= deep; i++) {
			if (temp[i] > ans[i])
				return false;
		}
		return true;
	}

	public static void dfs(int x, int deep) {// 当前节点为x，处于第deep层，也就是当前链长为deep
		temp[deep] = x;
		if (head[x] == 0) {// 表示起点为x已经没有边了，即此时x为链的最后一个节点
			if (deep > maxLen) {
				for (int i = 1; i <= deep; i++) {
					ans[i] = temp[i];
				}
				maxLen = deep;
			} else if (deep == maxLen) {// 链长一样，比较大小
				if (check(deep)) {//为true，表示temp的序列比ans小，满足题意
					for (int i = 1; i <= deep; i++) {
						ans[i] = temp[i];
					}
				}
			}
			return;//结束搜索
		}
		// 遍历起点为x的所有边
		for (int i = head[x];i != 0; i = e[i].next) {
			int to = e[i].to;// x指向的点作为起点，继续搜索
			dfs(to, deep + 1);// 层数加1，即链长加1
		}
	}
}

class Edge {
	// 假设边是 u-->v
	int to;// 记录指向的节点的v
	int next;// 表示节点u还指向其他的边，该边是总边的第 next 条边。如果next为0，表示节点u没有指向其他边了。

	public Edge() {
	}

	public Edge(int to, int next) {
		this.to = to;
		this.next = next;
	}
}